package com.ruoyi.order.service.impl;

import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.order.domain.OrderInfo;
import com.ruoyi.order.mapper.FileMapper;
import com.ruoyi.order.mapper.OrderMapper;
import com.ruoyi.order.service.IOrderService;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class OrderServiceImpl implements IOrderService {

    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private FileMapper fileMapper;

    /**
     * 根据条件分页查询订单数据
     *
     * @param orderinfo 订单数据信息
     * @return 订单数据集合信息
     */
    @Override
    public List<Map<String, Object>> searchOrderList(OrderInfo orderinfo) {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        List<SysRole> roles = loginUser.getUser().getRoles();

        // 当前登录人不是管理员，并且页面没有选择部门的场合
        if (!SecurityUtils.isAdmin(loginUser.getUserId()) && orderinfo.getDeptId() == null) {
            // 对角色采用最高权限

            // 自营店门店人员
            List<SysRole> role3 = roles.stream().filter(role -> "store".equals(role.getRoleKey()) || "selfstore".equals(role.getRoleKey())).collect(Collectors.toList());
            if (role3.size() > 0) {
                orderinfo.setDeptId(loginUser.getDeptId());
            }

            // 客户公司人员
            List<SysRole> role2 = roles.stream().filter(role -> "customercompany".equals(role.getRoleKey())).collect(Collectors.toList());
            if (role2.size() > 0) {
                orderinfo.setDeptId(loginUser.getDeptId());
            }
        }

        List<Map<String, Object>> result = orderMapper.searchOrderList(orderinfo);

        for (Map map : result) {
            List<Map<String, Object>> fileList = new ArrayList<>();
            if (map.containsKey("fileId")) {
                String[] flieIdArr = map.get("fileId").toString().split(",");
                String[] flieNameArr = map.get("fileName").toString().split(",");
                for (int i = 0; i < flieIdArr.length; i++) {
                    Map<String, Object> flie = new HashMap<>();
                    flie.put("fileId", flieIdArr[i]);
                    flie.put("fileName", flieNameArr[i]);
                    fileList.add(flie);
                }
            }
            map.put("file", fileList);
        }

        return result;
    }

    /**
     * 通过订单ID查询订单详细
     *
     * @param orderId 订单ID
     * @return 订单详细
     */
    @Override
    public Map<String, Object> selectOrderById(Long orderId) {
        return orderMapper.selectOrderById(orderId);
    }

    /**
     * 读取订单模板，生成对应实体类
     *
     * @param file
     * @return
     * @throws Exception
     */
    @Override
    public List<OrderInfo> upload(MultipartFile file) throws Exception {

        XSSFWorkbook workbook = new XSSFWorkbook(file.getInputStream());

        List<OrderInfo> orderInfos = new ArrayList<OrderInfo>();

        int sheets = workbook.getNumberOfSheets();

        for (int i = 0; i < sheets; i++) {
            XSSFSheet sheet = workbook.getSheetAt(i);
            OrderInfo orderInfo = new OrderInfo();

            /* 订单编号 */
            orderInfo.setOrderNo(sheet.getRow(5).getCell(6).getStringCellValue());

            /* 运单号 */
            orderInfo.setTrackingNo(sheet.getRow(6).getCell(6).getStringCellValue());

            /* 品名 */
            orderInfo.setProductName(sheet.getRow(7).getCell(6).getStringCellValue());

            /* 商品编号 */
            orderInfo.setProductId(sheet.getRow(8).getCell(6).getStringCellValue());

            /* 面料 */
            orderInfo.setPlusMaterial(sheet.getRow(9).getCell(6).getStringCellValue());

            /* 数量 */
            Long number = StringUtils.isEmpty(sheet.getRow(10).getCell(6).getStringCellValue()) ? 0 : Long.parseLong(sheet.getRow(10).getCell(6).getStringCellValue());
            orderInfo.setNumber(number);

            /* 单价 */
            BigDecimal price = StringUtils.isEmpty(sheet.getRow(11).getCell(6).getStringCellValue()) ? new BigDecimal("0") : new BigDecimal(sheet.getRow(11).getCell(6).getStringCellValue());
            orderInfo.setAmount(price);

            /* 下单时间 */
            orderInfo.setOrderTime(DateUtils.parseDate(sheet.getRow(14).getCell(6).getStringCellValue()));

            /* 接单时间 */
            orderInfo.setReceivingTime(DateUtils.parseDate(sheet.getRow(15).getCell(6).getStringCellValue()));

            /* 投产时间 */
            orderInfo.setProductionTime(DateUtils.parseDate(sheet.getRow(16).getCell(6).getStringCellValue()));

            /* 完成时间 */
            orderInfo.setCompletionTime(DateUtils.parseDate(sheet.getRow(17).getCell(6).getStringCellValue()));

            /* 理由 */
            orderInfo.setReason(sheet.getRow(18).getCell(6).getStringCellValue());

            /* 物流单位 */
            orderInfo.setShipAddress(sheet.getRow(20).getCell(6).getStringCellValue());

            /* 发货地址 */
            orderInfo.setLogisticsCompany(sheet.getRow(21).getCell(6).getStringCellValue());

            /* 交货时间 */
            orderInfo.setDeliveryTime(DateUtils.parseDate(sheet.getRow(22).getCell(6).getStringCellValue()));

            /* 门店名 */
            orderInfo.setStoreName(sheet.getRow(1).getCell(5).getStringCellValue());

            /* 门店地址 */
            orderInfo.setStoreAddress(sheet.getRow(1).getCell(7).getStringCellValue());

            /* 门店电话 */
            orderInfo.setStorePhone(sheet.getRow(2).getCell(5).getStringCellValue());

            /* 门店邮箱 */
            orderInfo.setStoreMailbox(sheet.getRow(2).getCell(7).getStringCellValue());

            /* 下单人姓名 */
            orderInfo.setUserName(sheet.getRow(4).getCell(2).getStringCellValue());

            /* 下单人电话 */
            orderInfo.setUserPhone(sheet.getRow(5).getCell(2).getStringCellValue());

            /* 下单人邮箱 */
            orderInfo.setUserMailbox(sheet.getRow(6).getCell(2).getStringCellValue());

            orderInfos.add(orderInfo);
        }

        return orderInfos;

    }

    /**
     * 通过订单ID更新订单状态
     *
     * @param orderIds 订单ID数组
     * @param model    更新区分（2：接单 3：投产 4：完成 5：发货）
     * @return 更新的结果数
     */
    @Override
    public int updateOrderStateByIds(Long[] orderIds, String model) {
        String loginUserId = String.valueOf(SecurityUtils.getUserId());
        return orderMapper.updateOrderStateByIds(orderIds, model, loginUserId);
    }

    /**
     * 订单删除
     *
     * @param orderIds 订单ID数组
     * @return 删除数
     */
    @Override
    public int deleteOrderByIds(Long[] orderIds) {
        return orderMapper.deleteOrderByIds(orderIds);
    }

    /**
     * 查询文件详细
     *
     * @param fileId 文件ID
     * @return 文件详细信息
     */
    @Override
    public Map<String, Object> selectFileById(String fileId) {
        return fileMapper.selectFileById(fileId);
    }

}
